#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "los_task.h"

UINT32 secs1, secs2, task1_id, task2_id;

UINT32 task1_entry(VOID)
{
    while (1)
    {
        // 计数器加1
        secs1++;
        printf("task1 demo\n");
        if (secs1 % 3 == 0)
        {
            printf("==========\n");
            // 恢复任务2
            LOS_TaskResume(task2_id);
            // 挂起任务1
            LOS_TaskSuspend(task1_id);
        }
        // 延时1000Tick，即1s
        LOS_TaskDelay(100);
    }
    return 0;
}

UINT32 task2_entry(VOID)
{
    while (1)
    {
        // 计数器加1
        secs2++;
        printf("task2 demo\n");
        if (secs2 % 3 == 0)
        {
            printf("==========\n");
            // 恢复任务1
            LOS_TaskResume(task1_id);
            // 挂起任务2
            LOS_TaskSuspend(task2_id);
        }
        // 延时1000Tick，即1s
        LOS_TaskDelay(100);
    }
    return 0;
}
UINT32 demo_task(VOID)
{
    UINT32 ret;
    TSK_INIT_PARAM_S param={0};

    // 锁住任务调度，防止高优先级任务调度
    LOS_TaskLock();
    // 任务名字
    param.pcName = "task1";
    // 任务入口地址
    param.pfnTaskEntry = (TSK_ENTRY_FUNC)task1_entry;
    // 任务优先级
    param.usTaskPrio = 10;
    // 任务栈
    param.uwStackSize = 0x400*4;
    // 调用系统函数，创建任务。成功之后任务处于就绪状态
    ret = LOS_TaskCreate(&task1_id, &param);
    if (ret != LOS_OK)
    {
        printf("create task11 failed, errno = %x\n", ret);
        // 创建任务失败，直接返回。
        goto exit_demo;
    }

    param.pcName = "task2";
    param.pfnTaskEntry = (TSK_ENTRY_FUNC)task2_entry;
    param.usTaskPrio = 10;
    param.uwStackSize = 0x400*4;
    // 创建任务2，成功之后任务处于挂起状态
    ret = LOS_TaskCreateOnly(&task2_id, &param);
    if (ret != LOS_OK)
    {
        printf("create task22 failed, errno = %x\n", ret);
        goto exit_demo;
    }

exit_demo:
    // 解锁任务调度
    LOS_TaskUnlock();

    return ret;
}

APP_FEATURE_INIT(demo_task);
